import { Injectable } from '@nestjs/common';
import { Student } from './interfaces/student.interface';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { CreateStudentDto } from './dto/create-student.dto';
import { UpdateStudentDto } from './dto/update-student.dto';
import { GetStudentsQueryDto } from './dto/get-students-query.dto';

@Injectable()
export class StudentsService {
  constructor(
    @InjectModel('Student') private readonly studentModel: Model<Student>,
  ) {}

  /**
   * 创建一个学生
   * @param createStudentDto 需要创建的学生
   */
  createStudent(createStudentDto: CreateStudentDto) {
    // 创建一个学生
    const createdStudent = new this.studentModel(createStudentDto);
    // 保存创建的学生
    return createdStudent.save();
  }

  /**
   * 获取所有学生
   */
  getStudents({ page = 1, size, className, name }: GetStudentsQueryDto) {
    // 查询到的学生们
    let students = this.studentModel.find({}, '-__v');
    // 过滤班级
    if (className) {
      students = students.where('className').equals(className);
    }
    // 过滤姓名
    if (name) {
      students = students.where('name').equals(name);
    }
    // 按照学号升序
    students = students.sort('studentID');
    if (size) {
      students = students.skip((page - 1) * size).limit(size);
    }
    // 返回学生们
    return students;
  }

  /**
   * 删除一些学生
   * @param students 学生们的 _id
   */
  deleteStudents(students: string[]) {
    const promises = [];

    // tslint:disable-next-line: variable-name
    students.forEach(async _id => {
      promises.push(this.studentModel.deleteOne({ _id }));
    });

    return Promise.all(promises);
  }

  /**
   * 修改一个学生的一些信息
   * @param _id 学生的数据的唯一 _id
   * @param updateStudentDto 需要修改的数据
   */
  // tslint:disable-next-line: variable-name
  updateStudent(_id: string, updateStudentDto: UpdateStudentDto) {
    return this.studentModel.updateOne({ _id }, updateStudentDto);
  }
}
